// JavaScript Document
// @require Class.js
// Clase para manipular todos los objetos window del sistema.

BrowserControler = new MyClass({
	/**  
     * Property: mainWindow
     * {DOM:window}
	 * Ventana principal desde donde se controlan/abren todas las demas del sistema.
     */
	 _mainWindow: null, 
	 /**  
     * Property: onClose
     * {Function}
	 * Funcion que se ejecuta cuando se cierran todas las ventanas, luego de llamar al 'closeAll'
     */
	 onClose: function(){}, 
	/**  
     * Property: myWindows
	 * {Array}
     * Array asociativo donde se almacenan las ventanas que se van abriendo en el sistema.
     */
	 _myWindows: null,
	 /**  
     * Property: createDate
     * {Date}
	 * Fecha de creacion del objeto, usada para extimar el tiempo desde que se creo la mainWindow.
     */
	 createDate: null,
	 /**  
     * Property: garbageTimeOut
     * {Timer}
	 * Instancia para limpiar el time out del GarbageCollector
     */
	 _garbageTimeOut: null,
	 
	 /** 
     * Method: init
     * 
     * Parameters:
     *  main - {DOM:window} 
     */
	 init: function(main, onclose){
		 this.createDate = new Date();
		 this._mainWindow = main;
		 if (onclose!=null) {
			 this.onClose = onclose;
		 }
		 this._myWindows = new Array();
		 this._initGarbageCollector()
	 },
	 
	 /** 
     * Method: _initGarbageCollector
     *    Recorre periodicamente el array de Child Windows y limpia las ventanas que fueron cerradas.
     */
	 _initGarbageCollector: function(){
		 var periodo = 60000; //1 minuto
		 var me = this;
		 var f = function garbage(){
			var pos = 0; 
			for(var indice in me._myWindows) { 
				if (me._myWindows[indice].closed){
					try{
      					delete me._myWindows[indice]; 
					}
					catch(e){};					
				}
				pos++;
    		}			
			me._garbageTimeOut=setTimeout(f,periodo);
		 }
		 this._garbageTimeOut=setTimeout(f,periodo);
	 },
	 
	 /** 
     * Method: closeChilds
     *    Cierra todas las ventanas hijas que estan abiertas
     */
	 closeChilds: function(){
		 for(var indice in this._myWindows) { 
		 	if (!this._myWindows[indice].closed){
				try{
      				this._myWindows[indice].close(); 
				}
				catch(e){};
			}
    	 }  
		 this._myWindows = new Array();
	 },
	 
	 /** 
     * Method: closeAll
     *    Cierra todas las ventanas abiertas, incluso la mainWindow (si es que puede) y ejecuta la funcion 'onClose'
     */
	 closeAll: function(){
		 this.closeChilds();
		 if(this._garbageTimeOut!=null)
			clearTimeout(this._garbageTimeOut);
		 this.onClose();
		 if (this._mainWindow.opener!=null) //NO ES VENTANA MADRE
			 this._mainWindow.close();	 	 	 
	 },
	 
	 /** 
     * Method: getWindow
     *    Dada una key retorna la window registrada. 
	 * Parameters:
	 *    key - {String}
     */
	 getWindow: function(key){
		if ((this._myWindows[key]!=null)&&(!this._myWindows[key].closed))
		 	return this._myWindows[key];
		return null;			
	 },
	 
	 /** 
     * Method: openPopup
     *    Crea y abre una ventana del tipo PopUp. Si la key existe y la ventana esta abierta, solo hace un focus de la misma. 
	 * Parameters:
	 *    from - {Window}
	 *    url - {String}
	 *    options - {String} 
	 *        values: 
	 *			'width=integer, height=integer, menubar=YES/NO, Status=YES/NO, titlebar=YES/NO, toolbar=YES/NO, 
	 *           top=integer, left=integer, scrollbars=YES/NO, reziseable=YES/NO'	
	 *    [key] - {String}
     */
	 openPopup: function(from, url, options, key){
		 if (key==null){
			 var now = new Date();
	  		 key = now.getTime();
		 }
		 else
		 	if ((this._myWindows[key]!=null)&&(!this._myWindows[key].closed)){
		 		this._myWindows[key].focus();
				return;
		 	}
		 var child = from.open(url, key, options);
		 this._myWindows[key] = child;
	 },
	 
	 /** 
     * Method: openPopup
     *    Crea y abre una ventana del tipo PopUp. Si la key existe y la ventana esta abierta, solo hace un focus de la misma. 
	 * Parameters:
	 *    from - {Window}
	 *    url - {String}
	 *    options - {String} 
	 *        values: 
	 *			'width=integer, height=integer, menubar=YES/NO, Status=YES/NO, titlebar=YES/NO, toolbar=YES/NO, 
	 *           top=integer, left=integer, scrollbars=YES/NO, reziseable=YES/NO'	
	 *    [key] - {String}
     */
	 refreshPopup: function(from, url, options, key){
		 if (key==null){
			 return;
		 }
		 else
		 	if ((this._myWindows[key]!=null)&&(!this._myWindows[key].closed)){
				this._myWindows[key].close();
				var child = from.open(url, key + new Date().getTime(), options);	
				this._myWindows[key] = child;
		 		this._myWindows[key].focus();
		 	}
	 }
	 
});